package com.copa.l21;

/**
 * @author copa
 * @createDate 2022-04-28 09:48
 * @function 迭代法，这里我用的方法跟l2策略类似，到这里算是懂了一点点技巧吧
 */
public class Test1 {

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 由于list1,list2的节点可能是0，但是java的listnode定义了int，int的值默认为0，所以我用null代表[]，这在leetcode是通过的
//        if (list1 == null && list2 == null) {
//            return null;
//        }
//        if (list1 == null) {
//            // 如果list1为[]
//            return list2;
//        } else if (list2 == null) {
//            // 如果list2为[]
//            return list1;
//        }
        // 定义一个返回listnode，但我不要头节点
        ListNode result = new ListNode();
        // 用一个临时指针指向result的位置
        ListNode temp = result;
        // 如果list1和list2有值
        while (list1 != null && list2 != null) {
            if (list1.val >= list2.val) {
                // 如果当前list1.val 大于等于 list2.val 则需要往result设置list2.val的值，并将list2指针往右移
                temp.next = new ListNode(list2.val);
                list2 = list2.next;
            } else {
                // 如果当前list1.val 小于 list2.val 则需要往result设置list1.val的值，并将list1指针往右移
                temp.next = new ListNode(list1.val);
                list1 = list1.next;
            }
            temp = temp.next;
        }
        // 如果list1仍有值
        // 这个是我第一次写的，这里可以优化一下，直接指向目前list1即可
//        while (list1 != null) {
//            temp.next = new ListNode(list1.val);
//            temp = temp.next;
//            list1 = list1.next;
//        }
        if (list1 != null) {
            temp.next = list1;
        }

        // 如果list2仍有值
        // 这个是我第一次写的，这里可以优化一下，直接指向目前list1即可
//        while (list2 != null) {
//            temp.next = new ListNode(list2.val);
//            temp = temp.next;
//            list2 = list2.next;
//        }
        if (list2 != null) {
            temp.next = list2;
        }
        return result.next;
    }

    public static void main(String[] args) {
        ListNode list1 = new ListNode(1);
        list1.next = new ListNode(2);
        list1.next.next = new ListNode(4);
        ListNode list2 = new ListNode(1);
        list2.next = new ListNode(3);
        list2.next.next = new ListNode(4);
        ListNode listNode = new Test1().mergeTwoLists(list1, list2);
        while (listNode != null) {
            System.out.print(listNode.val + "\t");
            listNode = listNode.next;
        }
    }
}
